home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / misc_func.inc < prev    next >
Text File  |  2005-03-31  |  12KB  |  530 lines

  1. # -*- Fundamental -*-
  2. #
  3. # (C) 2002 Michel Arboi <arboi@alussinan.org>
  4. # $Revision: 1.49 $
  5.  
  6. function replace_or_set_kb_item(name, value)
  7. {
  8.  if (defined_func("replace_kb_item"))
  9.   replace_kb_item(name: name, value: value);
  10.  else
  11.   set_kb_item(name: name, value: value);
  12. }
  13.  
  14. function register_service(port, proto, ipproto)
  15. {
  16.   local_var    k;
  17.   if (! ipproto) ipproto = "tcp";
  18.   if (! service_is_unknown(port:port, ipproto: ipproto))
  19.   {
  20.     if (debug_level) display("service is already known on port ", ipproto, ":", port, "\n");
  21.     #return(0);
  22.   }
  23.    
  24.   k = strcat("Known/", ipproto, "/", port);
  25.   set_kb_item(name: k, value: proto);
  26.   if (ipproto == "tcp") k = strcat("Services/", proto);
  27.   else k = strcat("Services/", ipproto, "/", proto);
  28.   replace_or_set_kb_item(name: k, value: port);
  29.   #display("register_service: port=", port, ", proto=", proto, "\n");
  30. }
  31.  
  32. # This function may fork!
  33. function known_service(port, ipproto)
  34. {
  35.   local_var    k, p;
  36.   if (! ipproto) ipproto = "tcp";
  37.   k = strcat("Known/", ipproto, "/", port);
  38.   p = get_kb_item(k);
  39.   #if (p) { display("Known service on port ", port, "\n"); }
  40.   #else { display("Unknown service on port ", port, "\n"); }
  41.   return p;
  42. }
  43.  
  44. # This function does not fork!
  45. function service_is_unknown(port, ipproto)
  46. {
  47.   local_var    k, p;
  48.   if (! ipproto) ipproto = "tcp";
  49.   k = strcat("Known/", ipproto, "/", port);
  50.   p = get_kb_list(k);
  51.   if (isnull(p)) return TRUE;
  52.   foreach k (p)
  53.     if (k != "unknown")    # fool proof
  54.       return FALSE;
  55.   return TRUE;
  56. }
  57.  
  58.  
  59.  
  60. function set_mysql_version(port, version)
  61. {
  62.   local_var    sb;
  63.   sb = string("mysql/version/", port);
  64.   set_kb_item(name: sb, value: version);
  65. }
  66.  
  67. function get_mysql_version(port)
  68. {
  69.   local_var    sb, vers, soc, result, MySQL_version, end_found;
  70.   sb = string("mysql/version/", port);
  71.   vers = get_kb_item(sb);
  72.   if (vers) return(vers);
  73.   else { # Get it on the fly.
  74.     if ( ! get_port_state(port) ) return NULL;
  75.     soc = open_sock_tcp(port);
  76.     if(!soc) return(NULL);
  77.     result = recv(socket:soc, length:1000);
  78.     close(soc);
  79.     if(strlen(result) < 6)return(NULL);
  80.     if("is not allowed" >< result)return(NULL);
  81.     if("is blocked" >< result) return(NULL);
  82.     MySQL_version = "";
  83.     if ((result[1] == raw_string(0x00)) && (result[2] == raw_string(0x00)) &&
  84.        (result[3] == raw_string(0x00)) && ((ord(result[4]) > 8) && (ord(result[4]) < 12))){
  85.       end_found = FALSE;
  86.       for (i = 0; end_found == FALSE ; i = i + 1) {
  87.         if (result[5+i] == raw_string(0x00)) {
  88.           end_found = TRUE;
  89.         } else {
  90.           MySQL_version = string(MySQL_version, result[5+i]);
  91.         }
  92.       }
  93.       set_mysql_version(port:port, version:MySQL_version);
  94.       return(MySQL_version);
  95.     }
  96.   }
  97.   return(NULL);
  98. }
  99.  
  100. function get_unknown_banner(port, ipproto, dontfetch)
  101. {
  102.   local_var    sb, banner, soc, req, tcp, p;
  103.  
  104.   if (! ipproto) ipproto = "tcp";
  105.   tcp = ipproto == 'tcp';
  106.   if (tcp)
  107.    sb = strcat("unknown/banner/", port);
  108.   else
  109.    sb = strcat("unknown/banner/", ipproto, "/", port);
  110.  
  111.   banner = get_kb_item(sb);
  112.   if (banner) return(banner);
  113.  
  114.   banner = get_kb_item("Banner/"+port);
  115.   if (banner) return(banner);
  116.                                                                                 
  117.   banner = get_kb_item("Amap/"+ipproto+"/"+port+"/FullBanner");
  118.   if (banner) return(banner);
  119.  
  120.   foreach p (make_list("spontaneous", "get_http", "help"))
  121.   {
  122.     banner = get_kb_item("FindService/"+ipproto+"/"+port+"/"+p);
  123.     if (banner) return(banner);
  124.   }
  125.  
  126.   if (dontfetch) return(NULL);
  127.   if (! get_port_state(port)) return (NULL);
  128.   if (! tcp) return (NULL);
  129.  
  130.   soc = open_sock_tcp(port);
  131.   if(!soc) return (NULL);
  132.   # I don't think that it makes sense to send an HTTP request
  133.   #req = http_head(item:"/", port:port);
  134.   #send(socket:soc, data:req);
  135.   banner = recv(socket:soc, length:2048);
  136.   close(soc);
  137.   if (banner)
  138.     replace_or_set_kb_item(name: sb, value: banner);
  139.   return(banner);
  140. }
  141.  
  142. function set_unknown_banner(port, banner, ipproto)
  143. {
  144.   local_var    sb;
  145.   if (! ipproto || ipproto == 'tcp')
  146.     sb = string("unknown/banner/", port);
  147.   else
  148.     sb = strcat('unknown/banner/', ipproto, '/', port);
  149.   set_kb_item(name: sb, value: banner);
  150. }
  151.  
  152. #
  153. # Get the banner for a given service
  154. # You must also specify a default port, in case this is not in the kb
  155. #
  156. function get_service_banner_line(service, port, ipproto)
  157. {
  158.   local_var    banner, soc, key, gport, tcp;
  159.   tcp = !ipproto || ipproto == 'tcp';
  160.   if (tcp)
  161.    gport = get_kb_item(strcat("Services/", service));
  162.   else
  163.    gport = get_kb_item(strcat("Services/", ipproto, "/", service));
  164.   if(!gport) gport = port;
  165.  
  166.   if (tcp) 
  167.    key = strcat(service, "/banner/", gport);
  168.   else
  169.    key = strcat(service, "/banner/", ipproto, "/", gport);
  170.  
  171.   banner = get_kb_item(key);
  172.   
  173.   if(!banner)
  174.   {
  175.     if (! tcp) return;
  176.  
  177.     if(get_port_state(gport))
  178.     {
  179.       soc = open_sock_tcp(gport);
  180.       if(soc)
  181.       { 
  182.     banner = recv_line(socket:soc, length:2048);
  183.     close(soc);
  184.       }
  185.     }
  186. #   if (banner) set_kb_item(name: key, value: banner);
  187.   }
  188.   
  189.   return(banner);
  190. }
  191. #
  192. # Fast replacement for getrpcport() which uses the libc
  193. #
  194. function get_rpc_port(program, protocol, portmap)
  195.  local_var    broken, req, soc, r, port;
  196.  local_var    a, b, c, d, p_a, p_b, p_c, p_d, pt_a, pt_b, pt_c, pt_d;
  197.  
  198.  
  199.  
  200.  a = rand() % 255;
  201.  b = rand() % 255;
  202.  c = rand() % 255;
  203.  d = rand() % 255;
  204.  
  205.  p_a = program / 16777216;     p_a = p_a % 256;
  206.  p_b = program / 65356;     p_b = p_b % 256;
  207.  p_c = program / 256;       p_c = p_c % 256;
  208.  p_d = program % 256;
  209.  
  210.  pt_a = protocol / 16777216; pt_a = pt_a % 256;
  211.  pt_b = protocol / 65535   ; pt_b = pt_b % 256;
  212.  pt_c = protocol / 256;    ; pt_c = pt_c % 256;
  213.  pt_d = protocol % 256;
  214.  
  215.  
  216.  req = raw_string(a,     b,     c,     d,     # XID
  217.            0x00, 0x00, 0x00, 0x00,    # Msg type: call
  218.           0x00, 0x00, 0x00, 0x02,    # RPC Version
  219.           0x00, 0x01, 0x86, 0xA0,    # Program
  220.           0x00, 0x00, 0x00, 0x02,    # Program version
  221.           0x00, 0x00, 0x00, 0x03,    # Procedure
  222.           0x00, 0x00, 0x00, 0x00,    # Credentials - flavor
  223.           0x00, 0x00, 0x00, 0x00,     # Credentials - length
  224.           0x00, 0x00, 0x00, 0x00,    # Verifier - Flavor
  225.           0x00, 0x00, 0x00, 0x00,    # Verifier - Length
  226.           
  227.           p_a,  p_b,  p_c,  p_d,    # Program
  228.           0xFF, 0xFF, 0xFF, 0xFF,    # Version (any)
  229.           pt_a, pt_b, pt_c, pt_d,    # Proto (udp)
  230.           0x00, 0x00, 0x00, 0x00    # Port
  231.            );
  232.     
  233.       
  234.  if(isnull(portmap)){
  235.    port = int(get_kb_item("rpc/portmap"));
  236.    if(port == 0)port = 111;
  237.    }
  238.  else port = portmap;
  239.        
  240.       
  241.  broken = get_kb_item(string("/tmp/rpc/noportmap/", port));
  242.  if(broken)return(0);
  243.  
  244.        
  245.  soc = open_sock_udp(port);
  246.  send(socket:soc, data:req);
  247.  r = recv(socket:soc, length:1024);
  248.  
  249.  close(soc);
  250.  if(!r)
  251.  {
  252.   set_kb_item(name:string("/tmp/rpc/noportmap/", port), value:TRUE);
  253.   return(0);
  254.  }
  255.  
  256.  if(strlen(r) < 28)
  257.   return(0);
  258.  else
  259.   {
  260.    p_d = ord(r[27]);
  261.    p_c = ord(r[26]);
  262.    p_b = ord(r[25]);
  263.    p_a = ord(r[24]);
  264.    port = p_a;
  265.    port = port * 256;
  266.    port = port +p_b; 
  267.    port = port * 256;
  268.    port = port + p_c; 
  269.    port = port * 256;
  270.    port = port + p_d;
  271.    return(port);
  272.   }
  273. }
  274.  
  275. #
  276. function rand_str(length, charset)
  277. {
  278.   local_var    l, i, s, n;
  279.  
  280.   if (! charset) 
  281.    charset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
  282.   if (isnull(length))
  283.     length = 8;
  284.   l = strlen(charset);
  285.   s = "";
  286.   for (i = 0; i < length; i ++)
  287.   {
  288.     n = rand() % l;
  289.     s += charset[n];
  290.   }
  291.   return s;
  292. }
  293.  
  294.  
  295.  
  296. function add_port_in_list(list, port)
  297. {
  298.  local_var l;
  299.  
  300.  
  301.  if(!get_port_state(port))
  302.  {
  303.   if(isnull(list))return make_list();
  304.   else return list;
  305.  }
  306.  
  307.  if(isnull(list))return make_list(port);
  308.  
  309.  foreach l (list)
  310.  { 
  311.   if(l == port)
  312.    return list;
  313.  }
  314.  
  315.  return make_list(list, port);
  316. }
  317.  
  318. # hex2raw was written by Renaud?
  319.  
  320. function hex2raw(s)
  321. {
  322.  local_var i, j, ret, l;
  323.  
  324.  s = chomp(s);    # remove trailing blanks, CR, LF...
  325.  l = strlen(s);
  326.  if (l % 2) display("hex2raw: odd string: ", s, "\n");
  327.  for(i=0;i<l;i+=2)
  328.  {
  329.   if(ord(s[i]) >= ord("0") && ord(s[i]) <= ord("9"))
  330.         j = int(s[i]);
  331.   else
  332.         j = int((ord(s[i]) - ord("a")) + 10);
  333.  
  334.   j *= 16;
  335.   if(ord(s[i+1]) >= ord("0") && ord(s[i+1]) <= ord("9"))
  336.         j += int(s[i+1]);
  337.   else
  338.         j += int((ord(s[i+1]) - ord("a")) + 10);
  339.   ret += raw_string(j);
  340.  }
  341.  return ret;
  342. }
  343.  
  344. function report_service(port, svc, banner)
  345. {
  346.  local_var    k, name, a;
  347.  
  348.  svc = tolower(svc);
  349.  k = strcat(svc, "/banner/", port);
  350.  set_kb_item(name: k, value: banner);
  351.  register_service(port: port, proto: svc);
  352.  if (svc == 'www') name = 'web server';
  353.  else if (svc == 'proxy') name = 'web proxy';
  354.  else if (svc == 'hylafax-ftp' || svc == 'hylafax') name = 'HylaFax server';
  355.  else if (svc == 'agobot.fo') name = 'Agobot.fo backdoor';
  356.  else if (svc == 'unknown_irc_bot') name = 'IRC bot';
  357.  else name = toupper(svc) +' server';
  358.  a = tolower(name[0]);
  359.  if (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'h') a = 'An ';
  360.  else a = 'A ';
  361.  security_note(port: port, data: a + name + ' is running on this port');
  362. }
  363.  
  364.  
  365.  
  366.  
  367.  
  368. function base64_decode(str)
  369. {
  370.  local_var len, i, j, k, ret, base64, b64;
  371.  len = strlen(str);
  372.  ret = "";
  373.  
  374.  base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  375.  
  376.  for (i = 0; i < 256; i++)
  377.    b64[i] = 0;
  378.  for (i = 0; i < strlen(base64); i++)
  379.    b64[ord(base64[i])] = i;
  380.  
  381.  for(j=0;j<len;j+=4)
  382.  {
  383.    for (i = 0; i < 4; i++)
  384.    {
  385.     c = ord(str[j+i]);
  386.     a[i] = c;
  387.     b[i] = b64[c];
  388.    }
  389.  
  390.    o[0] = (b[0] << 2) | (b[1] >> 4);
  391.    o[1] = (b[1] << 4) | (b[2] >> 2);
  392.    o[2] = (b[2] << 6) | b[3];
  393.    if (a[2] == ord('='))
  394.      i = 1;
  395.    else if (a[3] == ord('='))
  396.      i = 2;
  397.    else
  398.      i = 3;
  399.    for(k=0;k<i;k++)
  400.       ret += raw_string(int(o[k]) & 255);
  401.    
  402.    if (i < 3) 
  403.      break;
  404.  }
  405.  
  406.  return ret;
  407. }
  408.  
  409. __base64_code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  410. function base64_code(c)
  411. {
  412.  return(__base64_code[c]);
  413. }
  414.  
  415. function pow2(x)
  416. {
  417.  __ret = 1;
  418.  while(x)
  419.   {
  420.   __ret = __ret * 2;
  421.   x = x  - 1;
  422.   }
  423.  return(__ret);
  424. }
  425.  
  426. function base64(str)
  427. {
  428.  len = strlen(str);
  429.  i = 0;
  430.  ret = "";
  431.  char_count = 0;
  432.  _bits = 0;
  433.  while(i < len)
  434.  {
  435.   _bits = _bits + ord(str[i]);
  436.   char_count = char_count + 1;
  437.   if(char_count == 3)
  438.   {
  439.     val = _bits / 262144;
  440.     ret = string(ret, base64_code(c:val));
  441.     val = _bits / 4096;
  442.     val = val & 0x3F;
  443.     ret = string(ret, base64_code(c:val));
  444.     val = _bits / 64;
  445.     val = val & 0x3F;
  446.     ret = string(ret, base64_code(c:val));
  447.     val = _bits & 0x3F;
  448.     ret = string(ret, base64_code(c:val));
  449.     char_count = 0;
  450.     _bits = 0;
  451.  }
  452.  else {
  453.        _bits = _bits * 256;
  454.        }
  455.  i = i + 1;
  456.  }
  457.  
  458.  
  459.  if(!(char_count == 0))
  460.  {
  461.   cnt = char_count * 8;
  462.   mul = 16;
  463.   mul = mul - cnt;
  464.   mul = pow2(x:mul);
  465.   _bits = _bits * mul;
  466.   val = _bits / 262144;
  467.   ret = string(ret, base64_code(c:val));
  468.   val = _bits / 4096;
  469.   val = val & 0x3F;
  470.   ret = string(ret, base64_code(c:val));
  471.  if(char_count == 1)
  472.  { 
  473.   ret = string(ret, "==");
  474.  }
  475.  else
  476.  {
  477.    val = _bits / 64;
  478.    val = val & 0x3F;
  479.    ret = string(ret, base64_code(c:val), "=");
  480.   }
  481.  }
  482.  return(ret);
  483. }
  484.  
  485.  
  486. # This function converts a string representing a decimal number to 
  487. # to hexadecimal; eg, dec2hex(1098757090) == "417db3e2".
  488. #
  489. # Args:
  490. #   o num, decimal number.
  491. #
  492. # Return:
  493. #   hex number represented as a raw string.
  494. #
  495. # updated: 16-Nov-2004, George A. Theall
  496. #
  497. function dec2hex(num) {
  498.   local_var digits, hex, rem;
  499.   hex = "";
  500.  
  501.   num = int(num);
  502.   while (num > 0) {
  503.     rem = num % 256;
  504.     hex = raw_string(rem, hex);
  505.     num = num / 256;
  506.     if (num > 0 && num < 255) {
  507.       hex = raw_string(num, hex);
  508.       num = 0;
  509.     }
  510.   }
  511.   if (!hex) hex = raw_string(0x00);
  512.  
  513.   return hex;
  514. }
  515.  
  516. # Convert a Date CVS field to Unix time 
  517. # Michel Arboi
  518.  
  519. function cvsdate2unixtime(date)
  520. {
  521.   local_var v, u;
  522.   if (! defined_func("mktime")) return NULL;    # We could write it in NASL...
  523.   v = eregmatch(string: date, pattern: "\$Date: 2004/12/12 11:38:34 $");
  524.   if (isnull(v)) return;
  525.   u = mktime(year: v[1], mon: v[2], mday: v[3], hour: v[3], min: v[5], sec: v[6]);
  526.   return u;
  527. }
  528.  
  529.